//struct的高级用法 匿名字段
package main

import (
	"fmt"
)

type skills []string

type Human struct {
	name   string
	age    int
	weight int
	phone  string
}

type Student struct {

	//在这里直接上面使用了上面定义的结构体作为匿名字段！！
	//Human所拥有的全部字段都被隐式地引入了当前定义的这个Student。
	Human

	speciality string

	//使用内置类型和自定义类型作为匿名字段
	int
	skills
	phone string
}

func main() {
	mark := Student{Human: Human{"Mark", 25, 50, "human123456"}, speciality: "computer", phone: "study77985554"}
	fmt.Println("the name is ", mark.name) //匿名字段能够实现字段的继承

	mark.skills = []string{"anatomy"}
	fmt.Println(mark.skills[0])
	//所有的内置类型和自定义类型都是可以作为匿名字段的
	mark.skills = append(mark.skills, "maths", "art")
	fmt.Println(mark.skills)

	//两个struct里面都有phone这个字段，那么访问的时候默认是最外层的优先访问
	fmt.Println(mark.phone)       //输出  study77985554
	fmt.Println(mark.Human.phone) //输出 human123456
}
